package demo02;

import java.util.Comparator;

class OuterClass{
    public void test(){
        System.out.println("OuterClass::test()");
    }
}

//贴合接口来实现的匿名内部类
interface ITestAble{
    void test();
}


class Student{
    public int age;
}

class Out{
    public void func(){
        //局部内部类只能在方法当中使用
        class Inner{
            public int data1;
        }
    }
}


public class Test02 {
    public static void main(String[] args) {

        //匿名内部类
        //它没有名字 ， 此时我们就认为为 ， 这个匿名内部类它继承了 OuterClass ，也意味着我们能在里面重写 OuterClass 里面的方法
        //匿名内部类它要么实现接口 要么继承我们当前的类
        //使用方式一
//        new OuterClass(){//这种形式我们就叫做匿名内部类
//            public void test(){
//                System.out.println("重写 test()方法");
//            }
//        }.test();//通过这种方法调用 test() 方法
        //使用方式二
//        OuterClass out = new OuterClass(){
//            public void test(){
//                System.out.println("重写 test()方法");
//            }
//         };
//        //调用 test()
//        out.test();

        //贴合接口来实现的匿名内部类 第10行
        ITestAble iTestAble = new ITestAble(){
            @Override
            public void test() {
                System.out.println("重写 test()");
            }
        };
        //通过接口的引用来调用 test
        iTestAble.test();

        //使用 Comparable 接口  17行
        Comparator<Student> comparator = new Comparator<Student>(){

            @Override
            public int compare(Student o1,Student o2) {
                return o1.age - o2.age;
            }
        };
        /*
        局部内部类  很少使用 21行
        1.局部内部类只能在方法当中使用
        2.不能被 public static 等修饰符修饰
        3.编译器也有自己的独立的字节码文件 ， 命名格式： 外部类名字$数字内部类名字.class


         */
    }
}
